#ifndef _SYSTEM_PARAMETERS_
#define _SYSTEM_PARAMETERS_

#include "respond_struct_define.h"
#include <atomic>
#include <thread>

#pragma pack(1)
// 载荷状态获取响应报文格式1
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;   // 0x88-表示无人机状态回传指令回复消息
    uint8_t status;
    // 载荷状态信息
    // 0-载荷工作正常，1-载荷工作异常，2-载荷未启动，3、4-FPGA故障码，5、6、7、8、9-MCU故障码,10、11-微波故障码，其他-不解析（显示载荷异常），默认值为0。
    // 注：全目标有效，载荷包括靶标、空基、陆基
    uint8_t warning;
    // 载荷告警信息
    // 0-无告警，1-a类型告警，2-b类型告警，3-c类型告警，其他-备份，默认值为0。注：全目标有效，载荷包括靶标、空基、陆基。
    int16_t attenuation; // 微波衰减
    uint32_t frequency;  // 靶标辐射信号频率 || 微波中心频率
    uint16_t bandwidth;  // 靶标辐射信号带宽
                         // 25KHz，60KHz，200kHz，1MHz，6.5MHz
    uint8_t type;        // 靶标辐射信号类型
                         // 0-自定义波形  1-预定义波形
    uint8_t modulation;  // 靶标信号调制方式  0-BSPK、1-QPSK、2-DBPSK、3-DQPSK、4-8PSK
    uint8_t framestructure;
    // 靶标信号帧结构,
    // 设置信号帧结构帧长，1-1ms，2-10ms，3-100ms，4-1s，5-10s，默认=0其他预留
    uint8_t senseMode; // 载荷频谱感知模式 0-全频段；1-指定频段；2-窄带扫描；其他-预留
                       // 默认值为0
    uint32_t maxfrequency; // 感知节点感知频率上限，单位KHz
    uint32_t minfrequency; // 感知节点感知频率下限，单位KHz
    uint16_t maxbandwidth; // 感知节点感知带宽上限，单位KHz
    uint16_t minbandwidth; // 感知节点感知带宽下限，单位KHz
    int32_t battery_capacity;
    int32_t battery_voltage;
    int32_t temperature_1;
    int32_t temperature_2;
    int32_t latitude;
    int32_t longitude;
    int32_t altitude;
    uint16_t checksum;
    // 校验和
    // 校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} payload_status_t;

class SystemParameters {
  public:
    SystemParameters();
    ~SystemParameters();
    void start_update_thread();
    payload_status_t get_payload_status();
    void set_target_signal(target_signal_def *);
    void set_sense_config_parameters(sense_config_para_t *parameters);
    void set_narrowband_freq(uint32_t freq, uint16_t bandwidth, int16_t attenuation);

  private:
    void update_system_status_task();
    payload_status_t m_payload_status;
    std::thread update_thread;
    std::atomic<bool> thread_stop{false};
};
#pragma pack()

#endif // _SYSTEM_PARAMETERS_
